package com.hontlong.aixue.dao;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.support.DaoSupport;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;

public abstract class HibernateDaoSupport extends DaoSupport {
	private HibernateTemplate hibernateTemplate;

	@Override
	protected final void checkDaoConfig() {
		if (this.hibernateTemplate == null)
			throw new IllegalArgumentException(
					"'sessionFactory' or 'hibernateTemplate' is required");
	}

	protected final DataAccessException convertHibernateAccessException(
			HibernateException ex) {
		return this.hibernateTemplate.convertHibernateAccessException(ex);
	}

	protected HibernateTemplate createHibernateTemplate(
			SessionFactory sessionFactory) {
		return new HibernateTemplate(sessionFactory);
	}

	public final HibernateTemplate getHibernateTemplate() {
		return this.hibernateTemplate;
	}

	protected final Session getSession()
			throws DataAccessResourceFailureException, IllegalStateException {
		return getSession(this.hibernateTemplate.isAllowCreate());
	}

	protected final Session getSession(boolean allowCreate)
			throws DataAccessResourceFailureException, IllegalStateException {
		return !allowCreate ? SessionFactoryUtils.getSession(
				getSessionFactory(), false) : SessionFactoryUtils.getSession(
				getSessionFactory(), this.hibernateTemplate
						.getEntityInterceptor(), this.hibernateTemplate
						.getJdbcExceptionTranslator());
	}

	public final SessionFactory getSessionFactory() {
		return this.hibernateTemplate != null ? this.hibernateTemplate
				.getSessionFactory() : null;
	}

	protected final void releaseSession(Session session) {
		SessionFactoryUtils.releaseSession(session, getSessionFactory());
	}

	@Autowired(required = false)
	public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	@Autowired(required = false)
	public final void setSessionFactory(SessionFactory sessionFactory) {
		this.hibernateTemplate = createHibernateTemplate(sessionFactory);
	}
}